26. Declare Variable Late As Possible

생성자와 소멸자를 동반하는 변수(클래스, 구조체 등)은 정의될 때, 생성자가 호출되며,
유효범위 밖에서 소멸자가 호출되는 비용이 든다.
std::string encryptPassword(const std::string& password){
using namespace std;
string encrypted; //
if(password.length()<MinimumPasswordLength){
throw logic_error("Password is too short");
}
// ...
return encrypted
}
위에서 미리 정의된 encrpted 변수는 정상적인 프로세스에서는 사용되지만,
예외가 발생하는 경우, 사용되지 않는다.
(encrpted는 예외에 상관없이 객체의 생성과 소멸에 대한 비용을 소모한다.)
std::string encryptPassword(const std::string& password){
using namespace std;
void encrypt(std::string& s); // s
if(password.length()<MinimumPasswordLength){
throw logic_error("Password is too short");
}
string encrypted(password); //
encrypt(encrypted);
return encrypted;
}
루프(for, while)문에서는 상황에 따라 연산 비용이 작은 방향으로 객체 정의 위치를 결정한다.
// A
Widget w;
for(int i=0; i<n; ++i){
// w= about_i;
// ...
}
// B
for(int i=0; i<n; ++i){
Widgt w( /*about_i */);
}
A:
생성자 1번+소멸자 1번+대입 n번
B:
생성자 n번+소멸자 n번

클래스에 따라 대입 비용과 생성-소멸 비용이 다르다.
대입 비용이 더 높은 경우, B의 방법으로 구현하는 것이 좋고
생성-소멸 비용이 높은 경우, A 방법으로 구현한다.
(단, A 방법에서 w 변수의 유효범위가 B 영역보다 넓기 때문에
프로그램 이해도와 유지 보수성이 떨어질 수 있다.)

비용에서 큰 차이가 나지 않는 경우, 루프문 안에서 생성-소멸자를 호출해서 객체를 생성하는 것이 좋다.